package com.github.cakin.shiro.chapter19.service;

import com.github.cakin.shiro.chapter19.dao.UrlFilterDao;
import com.github.cakin.shiro.chapter19.entity.UrlFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.List;

/**
 * @className: UrlFilterServiceImpl
 * @description: UrlFilter实现类
 * @date: 2020/5/28
 * @author: cakin
 */
@Service
public class UrlFilterServiceImpl implements UrlFilterService {
    /**
     * urlFilterDao
     */
    @Autowired
    private UrlFilterDao urlFilterDao;
    /**
     * shiroFilerChainManager
     */
    @Autowired
    private ShiroFilerChainManager shiroFilerChainManager;

    /**
     * 功能描述：创建 urlFilter
     *
     * @param urlFilter urlFilter
     * @return UrlFilter UrlFilter
     * @author cakin
     * @date 2020/5/28
     */
    public UrlFilter createUrlFilter(UrlFilter urlFilter) {
        urlFilterDao.createUrlFilter(urlFilter);
        //  initFilterChain 来重新初始化 Shiro 的 URL 拦截器链，即同步数据库中的 URL 拦截器定义到 Shiro 中。
        initFilterChain();
        return urlFilter;
    }



    /**
     * 功能描述：更新 urlFilter
     *
     * @param urlFilter urlFilter
     * @return UrlFilter UrlFilter
     * @author cakin
     * @date 2020/5/28
     */
    public UrlFilter updateUrlFilter(UrlFilter urlFilter) {
        urlFilterDao.updateUrlFilter(urlFilter);
        initFilterChain();
        return urlFilter;
    }

    /**
     * 功能描述：删除 urlFilter
     *
     * @param urlFilterId urlFilterId
     * @author cakin
     * @date 2020/5/28
     */
    public void deleteUrlFilter(Long urlFilterId) {
        urlFilterDao.deleteUrlFilter(urlFilterId);
        initFilterChain();
    }

    /**
     * 功能描述：查找 urlFilter
     *
     * @param urlFilterId urlFilterId
     * @return UrlFilter UrlFilter
     * @author cakin
     * @date 2020/5/28
     */
    public UrlFilter findOne(Long urlFilterId) {
        return urlFilterDao.findOne(urlFilterId);
    }

    /**
     * 功能描述：查找所有 urlFilter
     *
     * @return List<UrlFilter> UrlFilter列表
     * @author cakin
     * @date 2020/5/28
     */
    public List<UrlFilter> findAll() {
        return urlFilterDao.findAll();
    }
    /**
     * 功能描述：初始化过滤器链
     *
     * @author cakin
     * @date 2020/5/28
     * 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行，并且只会被服务器执行一次。
     * PostConstruct在构造函数之后执行，init（）方法之前执行。
     * 通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序：
     * Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
     */
    @PostConstruct
    // 当容器启动时会自动回调 initFilterChain 来完成容器启动后的 URL 拦截器的注册。
    public void initFilterChain() {
        shiroFilerChainManager.initFilterChains(findAll());
    }

}
